package br.com.mauricioreis.db;

import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;

/**
 * Classe criada para representar um consumo, não é tabela do banco
 * 
 * @author mauricio
 * 
 */
public class Consumo {

    private static final String[] COLUMNS = new String[] { "carboidrato", "proteina", "gordura_total", "gordura_saturada", "fibra",
            "sodio", "calcio", "ferro", "vitamina_c" };
    private int id;

    private Float carboidrato;
    private Float proteina;
    private Float gorduraTotal;
    private Float gorduraSaturada;
    private Float fibra;
    private Float sodio;
    private Float calcio;
    private Float ferro;
    private Float vitaminaC;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setCarboidrato(Float carboidrato) {
        this.carboidrato = carboidrato;
    }

    public Float getCarboidrato() {
        return carboidrato;
    }

    public Float getProteina() {
        return proteina;
    }

    public void setProteina(Float proteina) {
        this.proteina = proteina;
    }

    public Float getGorduraTotal() {
        return gorduraTotal;
    }

    public void setGorduraTotal(Float gorduraTotal) {
        this.gorduraTotal = gorduraTotal;
    }

    public Float getGorduraSaturada() {
        return gorduraSaturada;
    }

    public void setGorduraSaturada(Float gorduraSaturada) {
        this.gorduraSaturada = gorduraSaturada;
    }

    public Float getFibra() {
        return fibra;
    }

    public void setFibra(Float fibra) {
        this.fibra = fibra;
    }

    public Float getSodio() {
        return sodio;
    }

    public void setSodio(Float sodio) {
        this.sodio = sodio;
    }

    public Float getCalcio() {
        return calcio;
    }

    public void setCalcio(Float calcio) {
        this.calcio = calcio;
    }

    public Float getFerro() {
        return ferro;
    }

    public void setFerro(Float ferro) {
        this.ferro = ferro;
    }

    public Float getVitaminaC() {
        return vitaminaC;
    }

    public void setVitaminaC(Float vitaminaC) {
        this.vitaminaC = vitaminaC;
    }

    /**
     * Consulta o consumo de um dia
     * 
     * @param atividade
     * @param data
     *            no formato yyyy-mm-dd
     * @return
     */
    public static Consumo consultar(Activity atividade, String data) {
        Cursor cursor = null;
        GenericDAO dao = obtemDao(atividade);
        String sql = montaSqlConsultaConsumo(data, null);
        cursor = dao.getComQuery(sql, null);
        return cursorParaConsumo(cursor);
    }

    private static Consumo cursorParaConsumo(Cursor cursor) {
        // Se o cursor está vazio, retorna nulo
        if (cursor.getCount() == 0) {
            return null;
        }
        int carboidratoColumn = cursor.getColumnIndex("carboidrato");
        int proteinaColumn = cursor.getColumnIndex("proteina");
        int gorduraTotalColumn = cursor.getColumnIndex("gordura_total");
        int gorduraSuturadaColumn = cursor.getColumnIndex("gordura_saturada");
        int fibraColumn = cursor.getColumnIndex("fibra");
        int sodioColumn = cursor.getColumnIndex("sodio");
        int calcioColumn = cursor.getColumnIndex("calcio");
        int ferroColumn = cursor.getColumnIndex("ferro");
        int vitaminaCColumn = cursor.getColumnIndex("vitamina_c");
        Consumo consumoRet = new Consumo();

        consumoRet.setCarboidrato(cursor.getFloat(carboidratoColumn));
        consumoRet.setProteina(cursor.getFloat(proteinaColumn));
        consumoRet.setGorduraTotal(cursor.getFloat(gorduraTotalColumn));
        consumoRet.setGorduraSaturada(cursor.getFloat(gorduraSuturadaColumn));
        consumoRet.setFibra(cursor.getFloat(fibraColumn));
        consumoRet.setSodio(cursor.getFloat(sodioColumn));
        consumoRet.setCalcio(cursor.getFloat(calcioColumn));
        consumoRet.setFerro(cursor.getFloat(ferroColumn));
        consumoRet.setVitaminaC(cursor.getFloat(vitaminaCColumn));

        return consumoRet;
    }

    private static ContentValues toContentValue(Consumo consumo) {
        ContentValues values = new ContentValues();
        values.put("carboidrato", consumo.getCarboidrato());
        values.put("proteina", consumo.getProteina());
        values.put("gordura_total", consumo.getGorduraTotal());
        values.put("gordura_saturada", consumo.getGorduraSaturada());
        values.put("fibra", consumo.getFibra());
        values.put("sodio", consumo.getSodio());
        values.put("calcio", consumo.getCalcio());
        values.put("ferro", consumo.getFerro());
        values.put("vitamina_c", consumo.getVitaminaC());
        return values;
    }

    private static GenericDAO obtemDao(Activity atividade) {
        return GenericDAO.getInstance(atividade, Entidade.DATABASE_NAME, null, null, Entidade.DATABASE_VERSION);
    }

    public static Consumo consultar(Activity atividade, String data, Refeicao refeicao) {
        Cursor cursor = null;
        GenericDAO dao = obtemDao(atividade);
        String sql = montaSqlConsultaConsumo(data, refeicao);
        cursor = dao.getComQuery(sql, null);
        return cursorParaConsumo(cursor);
    }

    private static String montaSqlConsultaConsumo(String data, Refeicao refeicao) {
        String filtroRefeicao = "";
        // Se é para tirar uma refeicao especifica do calculo
        if (refeicao != null && refeicao.getId() != 0) {
            filtroRefeicao = " AND r.id != " + refeicao.getId() + " ";
        }
        String sql = "SELECT COALESCE(SUM(p.quantidade * a.carboidrato * ma.medida_grama), 0) AS carboidrato, " + //
                " COALESCE(SUM(p.quantidade * a.proteina * ma.medida_grama), 0) AS proteina, " + //
                " COALESCE(SUM(p.quantidade * a.gordura_total * ma.medida_grama), 0) AS gordura_total, " + //
                " COALESCE(SUM(p.quantidade * a.gordura_saturada * ma.medida_grama), 0) AS gordura_saturada, " + //
                " COALESCE(SUM(p.quantidade * a.fibra * ma.medida_grama), 0) AS fibra, " + //
                " COALESCE(SUM(p.quantidade * a.sodio * ma.medida_grama), 0) AS sodio, " + //
                " COALESCE(SUM(p.quantidade * a.calcio * ma.medida_grama), 0) AS calcio, " + //
                " COALESCE(SUM(p.quantidade * a.ferro * ma.medida_grama), 0) AS ferro, " + //
                " COALESCE(SUM(p.quantidade * a.vitamina_c * ma.medida_grama), 0) AS vitamina_c " + //
                " FROM refeicao r, prato p, medida_alimento ma, alimento a " + //
                " WHERE r.id = p.id_refeicao " + //
                " AND ma.id = p.id_medida_alimento " + //
                " AND a.id = ma.id_alimento " + //
                " AND r.data like '" + data + "%'" + //
                filtroRefeicao;

        return sql;
    }

}
